#ifndef RESULTCURVECHART_H
#define RESULTCURVECHART_H

#include <QtCharts>
#include <QWidget>
#include <QMouseEvent>
#include <QList>
#include <QSplineSeries>
#include <QAbstractAxis>
#include <QValueAxis>
#include <QPen>
#include <QLabel>
#include <QString>

#include "customchartview.h"
#include "Constant.h"

#define MAX_YDISTANCE 80.0 // 设定鼠标与阈值线之间的垂直距离小于设定的最大垂直距离时。激活阈值线
#define ACTIVATE_LINE_THICKNESS 3 // 设置激活阈值线的粗细

class YuzhiLineEdit;
class experimentresultui;

class ResultCurveChart : public QChart
{
    Q_OBJECT
public:
    explicit ResultCurveChart(QGraphicsItem *parent = nullptr);
    ~ResultCurveChart();

signals:
    void updateYuZhi(QHash<QString, double> yuZhi); // 信号：更新结果页面阈值
//    void doubleClicked (bool); //信号：双击编辑YuzhiLineEdit
    void returnYuzhiHash(QString key);
public slots:
    void initMoveEvent(QMouseEvent *event); // 初始化移动事件
    void handleLineMove(QMouseEvent *event); // 控制阈值线移动
    void finishMoveEvent(QMouseEvent *event); // 移动事件结束，进行后续处理
    void widgetResizeEvent(QResizeEvent *event); // 窗口大小改变
    void determineDClickPos(QMouseEvent *event); // 判断双击位置触发编辑阈值
private:

    QString yuZhiActivate; // 判断哪条阈值线激活
    bool mousePressFlag; // 鼠标按下标识


    QHash<QString, QColor> lineColorHash; // 颜色
    QList<QString> validYuZhi; // 合法阈值数组

    QHash<QString, QSplineSeries*> seriesList; // 图表序列
    double yUnit; // 计算鼠标坐标在图表上的映射的单位长度
    QValueAxis *axisY; // 图表y轴
    double yMax; // y轴最大值
    double previousPosMapY; // 记录鼠标上次的位置

public:
    CustomChartView *ccView; // QChart自定义视图

    QHash<QString, double> yuZhiHash; // 阈值

    QHash<QString, YuzhiLineEdit*> yuZhiLabelHash; // 阈值标签



private:
    void activatedLine(double mouseY); // 判断阈值线和鼠标之间的距离，小于最大距离，激活阈值线
    void toggleLineStatus(QSplineSeries* activateSeries, QColor lineColor); // 改变线的激活状态


public:
    void init(QHash<QString, QSplineSeries*> seriesHash, CustomChartView *chartView); // 初始化函数
    void setSeriesInfo(QHash<QString ,double> yuZhi, QHash<QString, QColor> lineColor, QHash<QString, YuzhiLineEdit*> yuZhiLabel, QList<QString> validYuZhi); // 获取阈值线所需信息
    void clear(); // 清除函数
    void updateMapUnit(); // 更新映射计算单元
    void updateYuZhiLabelPos(YuzhiLineEdit *yuZhiLabel, double mapPos); // 更新阈值标签位置


    void disconnectPressEvent(); // 解绑鼠标按下事件
    void disconnectMoveEvent(); // 解绑鼠标移动事件
    void disconnectReleaseEvent(); // 解绑鼠标释放事件
    void disconnectDoubleClickEvent(); // 解绑鼠标双击事件
    void disconnectChangeEvent(); // 解绑窗口变换事件

    void connectPressEvent(); // 绑定鼠标按下事件
    void connectMoveEvent(); // 绑定鼠标移动事件
    void connectReleaseEvent(); // 绑定鼠标释放事件
    void connectDoubleClickEvent(); // 绑定鼠标双击事件
    void connectChangeEvent(); // 绑定窗口切换大小事件
};

#endif // RESULTCURVECHART_H
